// 引入其他的类
import Food from './Food'
import ScorePanel from './ScorePanel'
import Snake from './Snake'

// 游戏控制器，控制其他的所有类
class GameControl{
  // 定义三个属性
  food: Food;
  scorePanel: ScorePanel;
  snake: Snake;
  // 创建一个属性来存储蛇的移动方向（也就是按键的方向）
  direction: string = '';
  // 创建一个属性用来记录游戏是否结束
  isLive = true; 
  
  constructor() {
    this.food = new Food();
    this.scorePanel = new ScorePanel(10, 1);
    this.snake = new Snake();
    this.init()
  }
  // 游戏初始化开始
  init() {
    // 绑定键盘按键按下的事件
    document.addEventListener('keydown', this.handlerKeydown.bind(this));
    
    // 调用run方法，使蛇移动
    this.run()

    this.food.change();
  }
  // 创建一个键盘按下的响应函数
  handlerKeydown(event: KeyboardEvent) {
    // console.log(this)
    // console.log(event.key)
    // 需要检查event.key的值是否合法（用户是否按了正确的按键）
    // 修改direction属性
    this.direction = event.key;
  }
  // 创建一个控制蛇移动的方法，根据方向this.direction来使蛇的位置改变
  run() {
    // 获取蛇现在坐标
    let X = this.snake.X;
    let Y = this.snake.Y;
 
    // 根据按键防线来修改X值Y值
    switch(this.direction) {
      case 'ArrowUp':
      case 'Up': Y -= 10;
            break;
      case 'ArrowDown':
      case 'Down': Y += 10;
            break;
      case 'Left':
      case 'ArrowLeft': X -= 10;
            break;
      case 'Right':
      case 'ArrowRight': X += 10;
            break;
    }

    // // 检查蛇是否吃到了食物
    // if(this.checkEat(X, Y)) {
    //   console.log('吃到食物了！')
    //   // 食物的位置要进行重置
    //   this.food.change();
    //   // 分数增加
    //   this.scorePanel.addScore();
    //   // 蛇要增加一节
    //   this.snake.addBody();
    // }
    this.checkEat(X, Y);

    try {
      // 修改蛇的X和Y的值
      this.snake.X = X;
      this.snake.Y = Y;
    } catch (e) {
      // 进入到catch，说明出现了异常，游戏结束，弹出一个提示信息
      alert(e.message + ' GAME OVER!');
      // 将isLive设置为false
      this.isLive = false;
    }

    // 开启一个定时调用
    this.isLive && setTimeout(this.run.bind(this), 300 - (this.scorePanel.level - 1) *30); // 30 ~ 300
  }

  // 定义一个方法，用来检查蛇是否吃到食物
  checkEat(X:number, Y:number) {
    // 检查蛇是否吃到了食物
    if(X === this.food.X && Y === this.food.Y) {
      console.log('吃到食物了！')
      // 食物的位置要进行重置
      this.food.change();
      // 分数增加
      this.scorePanel.addScore();
      // 蛇要增加一节
      this.snake.addBody();
    }
    // return X === this.food.X && Y === this.food.Y;
  }
}

export default GameControl
